package features.advance.leetcode.linkedlist.medium;

import com.alibaba.fastjson.JSONObject;

import java.util.List;

/**
 *
 *  11. 盛最多水的容器
 * 给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线，垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线，使得它们与 x 轴共同构成的容器可以容纳最多的水。
 *
 * 说明：你不能倾斜容器。
 *
 *
 *
 * 示例 1：
 *
 *
 *
 * 输入：[1,8,6,2,5,4,8,3,7]
 * 输出：49
 * 解释：图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下，容器能够容纳水（表示为蓝色部分）的最大值为 49。
 * 示例 2：
 *
 * 输入：height = [1,1]
 * 输出：1
 * 示例 3：
 *
 * 输入：height = [4,3,2,1,4]
 * 输出：16
 * 示例 4：
 *
 * 输入：height = [1,2,1]
 * 输出：2
 *
 *
 * 提示：
 *
 * n = height.length
 * 2 <= n <= 3 * 104
 * 0 <= height[i] <= 3 * 104
 *
 * @author LIN
 * @date 2021-04-25
 */
public class Solution11 {
    private int begin;

    public int maxArea(int[] height) {
        if(height == null || height.length == 0){
            return 0;
        }
        int res = 0,n=height.length;
        int start = 0,rk = n-1; // 窗口开始位置
        while(start != rk){
            res = Math.max(res,Math.min(height[start],height[rk])*(rk-start));
            if(height[start] < height[rk]){
                start++;
            }else {
                rk--;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String str = "[1,8,6,2,5,4,8,3,7]";
        List<Integer> arr = JSONObject.parseArray(str, Integer.class);
        int[] array = new int[arr.size()];
        for (int i = 0; i < arr.size(); i++) {
            array[i] = arr.get(i);
        }
        Solution11 solution11 = new Solution11() {
            @Override
            public int maxArea(int[] height) {
                int l = 0,r = height.length-1,maxArea=0;

                while(l < r){
                    int w = r-l;
                    int lh = height[l];
                    int rh = height[r];
                    int  h = lh > rh ? rh : lh;
                    maxArea = Math.max(maxArea,h*w);

                    if(lh > rh){
                        while(l<r){
                            if(rh >= height[r]){
                                r--;
                            }else{
                                break;
                            }
                        }
                    }else {
                        while(l<r){
                            if(lh >= height[l]){
                                l++;
                            }else{
                                break;
                            }
                        }
                    }
                }
                return maxArea;
            }
        };

        int i = solution11.maxArea(array);
        System.out.println(i);

    }
}
